#include <iostream>
#include <string>
#include <chrono>
#include <thread>

// fmt库头文件
#include <fmt/format.h>
#include <fmt/color.h>
#include <fmt/chrono.h>

// spdlog库头文件
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/rotating_file_sink.h>

int main() {
    // 配置spdlog
    try {
        // 创建控制台输出logger
        auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
        console_sink->set_level(spdlog::level::debug);
        
        // 创建文件输出logger
        auto file_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(
            "logs/fmt_spdlog_example.log", 1024*1024, 3);
        file_sink->set_level(spdlog::level::info);
        
        // 创建logger并添加两个sink
        auto logger = std::make_shared<spdlog::logger>("fmt_spdlog_example", 
            spdlog::sinks_init_list{console_sink, file_sink});
        spdlog::register_logger(logger);
        
        // 设置全局logger
        spdlog::set_default_logger(logger);
        
    } catch (const spdlog::spdlog_ex& ex) {
        std::cerr << "Log initialization failed: " << ex.what() << std::endl;
        return 1;
    }
    
    // 使用fmt库进行格式化输出
    std::cout << "=== fmt库示例 ===" << std::endl;
    
    // 基本格式化
    std::string name = "World";
    int age = 25;
    double height = 1.75;
    
    std::cout << fmt::format("Hello, {}! You are {} years old and {}m tall.\n", 
                             name, age, height);
    
    // 带颜色的输出
    fmt::print(fg(fmt::color::red), "这是红色文字\n");
    fmt::print(fg(fmt::color::green), "这是绿色文字\n");
    fmt::print(fg(fmt::color::blue), "这是蓝色文字\n");
    
    // 时间格式化
    auto now = std::chrono::system_clock::now();
    std::cout << fmt::format("当前时间: {:%Y-%m-%d %H:%M:%S}\n", now);
    
    // 数字格式化
    double pi = 3.14159265359;
    std::cout << fmt::format("π = {:.2f}\n", pi);
    std::cout << fmt::format("π = {:.6f}\n", pi);
    
    // 使用spdlog进行日志记录
    std::cout << "\n=== spdlog库示例 ===" << std::endl;
    
    spdlog::info("程序启动成功");
    spdlog::debug("调试信息: 用户输入 - name={}, age={}, height={}", name, age, height);
    spdlog::warn("警告: 用户年龄可能不准确");
    
    // 模拟一些工作
    for (int i = 1; i <= 3; ++i) {
        spdlog::info("处理任务 {}...", i);
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
        spdlog::info("任务 {} 完成", i);
    }
    
    // 错误日志
    spdlog::error("模拟错误: 无法连接到数据库");
    
    // 使用fmt和spdlog结合
    std::string formatted_message = fmt::format("用户 {} (年龄: {}) 登录成功", name, age);
    spdlog::info(formatted_message);
    
    // 格式化表格
    std::cout << "\n=== 格式化表格 ===" << std::endl;
    std::cout << fmt::format("{:<15} {:<10} {:<10}\n", "姓名", "年龄", "身高");
    std::cout << fmt::format("{:<15} {:<10} {:<10}\n", "---", "---", "---");
    std::cout << fmt::format("{:<15} {:<10} {:<10}\n", name, age, height);
    std::cout << fmt::format("{:<15} {:<10} {:<10}\n", "Alice", 30, 1.65);
    std::cout << fmt::format("{:<15} {:<10} {:<10}\n", "Bob", 28, 1.80);
    
    spdlog::info("程序执行完成");
    
    return 0;
} 